package collection.Stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;

public class StreamApiDemo3 {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        Random r=new Random();
        for (int i = 0; i <3 ; i++) {
            list.add(r.nextInt(100));

        }
        System.out.println(list);
        /*
        常见的终端环节:
        min:获取流中最小的元素
        max:获取流中最大的元素
        anyMatch:判断流中是否有满足条件的元素
        noneMatch:判断流中是否没有满足条件的元素
        collect:将流中的元素收集到集合中
        reduce:将流中的元素反复结合起来，得到一个集合
         */
//        Optional<Integer> min =list.stream().min((e1, e2)->e1-e2);
//        int n= min.get();
//        System.out.println(n);
        int min=list.stream().min((e1,e2)->e1-e2).get();
        System.out.println(min);
        //获取最大值
        int max=list.stream().max((e1,e2)->e1-e2).get();
        System.out.println(max);
        //判断集合中是否存在偶数
        boolean anyMatch= list.stream().anyMatch(e->e%2==0);
        System.out.println("是否存在偶数:"+anyMatch);
        //判断集合中是否所有元素都是奇数
        boolean allMatch= list.stream().allMatch(e->e%2!=0);
        System.out.println("是否存在奇数:"+allMatch);
        boolean noneMatch= list.stream().noneMatch(e->e<=50);
        System.out.println("是否都不小于等于50:"+noneMatch);
        /*
            reduce:积累操作
            将集合每个元素最终积累为1个值
            例如:
            集合元素:[e1,e2,e3,e4,e5]
            reduce会进行若干次，第一次会用第一个元素和第二个元素进行操作
            将操作结果与第三个元素操作，再将操作结果与第四个元素操作直到与
            最后一个元素操作
            e1-e2 reduce 得到结果:e
            e-e3  reduce 得到结果:e
            e-e4  reduce 得到加过:e
            ...
            e-en  reduce 得到最终结果:e


            将集合[a,b,c,d,e]所有元素累加，得到结果
            a+b+c+d+e=?
             list.stream().reduce((e1, e2)->e1+e2);
             第一次:e1+e2 -> n
                   a  b
             第二次:e1+e2 -> n
                   n  c
             第三次:e1+e2 -> n
                   n  d
         */
        int num=list.stream().reduce((e1,e2)->e1+e2).get();
        System.out.println(num);

    }
}
